|
このテクニカルノートは、ICMGetPixelFormatInfo を呼び出す前に、ICMPixelFormatInfo 構造体の size フィールドに値を設定しておかなければならない理由について説明します。
[2002 年 7 月 17 日] |
はじめに
Image Compression Manager ルーチン、
ICMGetPixelFormatInfo は、PixelFormat
コードおよびあらかじめ用意された ICMPixelFormatInfo 構造体へのポインタを受け取り、指定されたピクセル形式に関する情報をこの構造体に書き込みます。
OSErr ICMGetPixelFormatInfo( OSType PixelFormat,
ICMPixelFormatInfoPtr theInfo ); |
PixelFormat - ピクセル形式を識別する数字、すなわち 4 文字コードのコード
ICMPixelFormatInfoPtr - ピクセル形式情報が返される ICMPixelFormatInfo 構造体へのポインタ |
コードでは、ICMGetPixelFormatInfo を呼び出す前に
ICMPixelFormatInfo 構造体のサイズフィールドに値を設定しておくことが非常に重要です。 このフィールドは sizeof(ICMPixelFormatInfo) を使って初期化します。C 言語では、次の構文を使って、この初期化に加えて、構造体の残りのフィールドをゼロに設定できます。
ICMPixelFormatInfo myICMPixelFormatInfo = {sizeof(ICMPixelFormatInfo), 0}; | |
ICMGetPixelFormatInfo を複数回呼び出す場合は、各呼び出しの前に size フィールドを sizeof(ICMPixelFormatInfo) を使ってリセットします。
先頭に戻る
なぜ値の設定が必要か
バージョンアップの時々で、この ICMPixelFormatInfo 構造体の末尾に、新しいフィールドが追加されています。QuickTime 4.1 では、
defaultGammaLevel が追加され、QuickTime 6.0 では、
horizontalSubsampling と verticalSubsampling
が追加されています。
Image Compression Manager は、size フィールドに指定された値以上のバイト数を書き込まないように注意します。戻ってきたときには、size フィールドには、データ構造体の
有効なバイト数が示されています。
size フィールドに値を設定することによって、アプリケーションおよび Image Compression Manager が異なるバージョンの構造体でコンパイルされた場合でも、Image Compression
Manager が構造体の終端を越えて書き込みをしないことを(そしてスタックを破壊してしまわないことを)保証します。
// QuickTime 6.0
struct ICMPixelFormatInfo {
long size;
unsigned long formatFlags;
short bitsPerPixel[14]; /* プレーン方式の場合は、プレーンごとの
ピクセルあたりビット数をリストする */
/* QuickTime 4.1 で新しく追加されたフィールド */
Fixed defaultGammaLevel;
/* QuickTime 6.0 で新しく追加されたフィールド */
short horizontalSubsampling[14]; /* プレーンごと
プレーンがサブサンプルされていない場合は 1 を使う*/
short verticalSubsampling[14]; /* プレーンごと
プレーンがサブサンプルされていない場合は 1 を使う */
};
typedef struct ICMPixelFormatInfo ICMPixelFormatInfo;
typedef ICMPixelFormatInfo * ICMPixelFormatInfoPtr; |
size - この構造体のサイズ。ICMGetPixelFormatInfo の処理に入った時点で、この構造体を受け入れるために利用できるメモリ容量を示します。処理から戻る時点では、設定されたデータの量を示します。ICMSetPixelFormatInfo の処理に入った時点では、構造体に格納されている有効なデータの量を示します。有効であると指定されたフィールド以降のフィールドには、ゼロが含まれていると解釈するべきです。
formatFlags - ピクセル形式に関する情報を示す定数(下記参照)。
bitsPerPixel - ピクセルの各コンポーネントのビット数を定義する配列。bitsPerPixel[0] には最初のコンポーネントのビット数、bitsPerPixel[1] には 2 番目のコンポーネントのビット数が含まれます(以下同様です)。このパラメータの意味は形式フラグによって変わります(下記参照)。
defaultGammaLevel - このピクセル形式で新規に作成された GWorld のデフォルトのガンマレベル。ビデオのピクセル形式では、しばしばdefaultGammaLevel は 2.2 (kQTCCIR601VideoGammaLevel )に設定されます。ゼロは、プラットフォームの標準ガンマレベルを使用することを意味します。このフィールドは、QuickTime 4.1 で追加されました。
horizontalSubsampling 、
verticalSubsampling - プレーナ方式によるピクセル形式の場合、これらの配列は、各コンポーネントのサブサンプルを表します。たとえば、「プレーナ方式 YUV 4:2:0」は、ピクセルごとに 1 つの Y サンプル(サブサンプルは 1,1)、4 つのピクセルから構成されるスクエアごとに U サンプル 1 つ、V サンプル 1 つ(サブサンプルはそれぞれ 2,2 と 2,2)を持っています。したがって、kYUV420PixelFormat の horizontalSubsampling フィールドとverticalSubsampling フィールドは、共に [1,2,2] を含みます。使用しないフィールドはゼロに設定してください。この情報により、QuickTime は、プレーナ方式のピクセル形式に GWorlds を割り当て、プレーナ方式のコンポーネントのヘッダを正しく設定することができます。このフィールドおよび機能は、QuickTime 6 で追加されました。
kICMPixelFormatIsPlanarMask - このマスク定数は、最下位 4 ビット(0x0000000F)をマスクします。formatFlags のこれらのビットが 2 以上の場合、ピクセル形式はプレーナ形式で、bitsPerPixel [ ] は各ピクセルコンポーネントのビット数を表します。そうでない場合は、ピクセル形式はチャンク方式(プレーナ方式ではない)で、bitsPerPixel [0] は、各ピクセルのビット数を表します(チャンク方式のピクセル形式を定義する場合はこれらのビットをゼロに設定します)。チャンク方式のピクセル形式では、個々のコンポーネントが一緒にパッキングされます。たとえば、32 ビットの ARGB の 3 つのピクセルは、メモリ上では、ARGBARGBARGB として表現されます。プレーナ方式では、個々のコンポーネントが別々にパッキングされます。
kICMPixelFormatIsIndexed - ビデオのピクセル形式がインデックスされている(つまり本質的には個別のコンポーネントがない)場合、このフラグが設定されます。一般的には、1 ピクセルあたり 8 ビット以下のカラーモードの場合はインデックスされます。
kICMPixelFormatIsSupportedByQD - このフラグが設定されている場合、この種のピクセルデータを保持している PixMap 構造体に対して QuickDraw を呼び出せます。Macintosh では、従来の QD ピクセル形式では、このフラグが設定されていますが、YUV ピクセル形式では設定されていません。Windows での QuickDraw の実装では、より多くのピクセル形式をサポートしている必要があるので、Windows 上では、Macintosh よりも多くのピクセル形式でこのフラグが設定されています。
kICMPixelFormatIsMonochrome - このフラグが設定されている場合、ピクセル形式はカラーではありません。このフラグは
QuickTime 6 で追加されました。
kICMPixelFormatHasAlphaChannel - このフラグが設定されている場合、ピクセル形式に、アルファチャネルが含まれます。このフラグは QuickTime 6 で追加されました。 |
次に、ピクセル形式がプレーナ方式であるかどうかを調べるために ICMGetPixelFormatInfo を呼び出すルーチンの例を示します。
Boolean IsPixelFormatPlanar(OSType inPixelFormat)
{
OSErr err;
ICMPixelFormatInfo outInfo = {sizeof(ICMPixelFormatInfo), 0};
err = ICMGetPixelFormatInfo(inPixelFormat, &outInfo);
if (noErr != err)
return false; // ピクセル形式はプレーナ方式ではない
if ((outInfo.formatFlags & kICMPixelFormatIsPlanarMask) < 2)
return false; // ゼロはピクセル形式がチャンク方式であることを意味する。
// プレーンが 1 つということは意味がない。
return true; // ピクセル形式はプレーナ方式である
} | |
先頭に戻る
参考文献
ICMGetPixelFormatInfo
Pixel Formats
ICMPixelFormatInfo structure
先頭に戻る
ダウンロード
先頭に戻る
|